#MorfoloĆĄka obrada slike predstavlja skup postupaka kojim se nad naĆĄom poÄetnom slikom vrĆĄe modifikacije objekata
#na slici, sa ciljem lakĆĄe i preciznije obrade za naredne korake. Ona podrazumeva: glaÄanje ivica objekata, popravke
#oĆĄteÄenih ili raskinutih delova na slici, popunjavanje razlivenih objekata (npr. iskreniranih slova i dokumenata),
#popunjavanje rupa nad objektima, uklanjanje sitnih ĆĄumova malih povrĆĄina na slici itd. Ovde Äemo raditi
#uglavnom morfoloĆĄku obradu binarnih i grayscale slika.
#potrebno je najpre instalirati biblioteke za rad sa algoritmima za morfoloĆĄku obradu slike
import Pkg;
Pkg.add("ImageMorphology");
Pkg.add("ImageView");
using Images, ImageView, ImageMorphology, Colors, ImageCore, StaticArrays, TestImages
sl1 = zeros(Gray{N0f8},1000,1000);
sl1[400:700,400:700] .= 1;
imshow(sl1)
#Dilatacija predstavlja postupak raĆĄirenja naĆĄeg objekta, sa ciljem da se izvrĆĄi proĆĄirenje njegovih ivica.
#Ona radi na jednostavnom principu prolaskom maske kroz naĆĄu sliku, i ukoliko se dogodi da se postoji bar jedno
#preklapanje maske na nekoj svojoj poziciji sa pikselom slike nad kojim je ta pozicija trenutno, onda se centralni
#piksel tj. piksel koji se u datom trenutku po poziciji poklapa sa centralnim elementom maske postavlja na neku
#predefinisanu vrednost (obiÄno je to 1)
sl1_dil = dilate(sl1);
imshow(sl1_dil)
imshow(sl1_dil-sl1)
#Kao ĆĄto moĆŸemo videti izvrĆĄeno je proĆĄirivanje naĆĄeg kvadrata sa svih strana
#Erozija predstavlja proces kod koga se vrĆĄi "uklanjanje viĆĄkova sa objekta". Kod erozije se, kao i kod dilatacije
#prelazi Äitavom, predefinisanom maskom preko naĆĄe slike, i da bi se saÄuvao centralni piksel tj. onaj nad kojim je
#u datom trenutku postavljena naĆĄa maska, potrebno je da se izvrĆĄi poklapanje naĆĄe maske sa svim elementima kojima
#odgovaraju njeni elementi
sl1_erod = erode(sl1);
imshow(sl1_erod)
imshow(sl1 - sl1_erod)
#Erozija i dilatacija same po sebi nisu mnogo bitne operacije, meÄutim njihova viĆĄetruka primena ili kombinovana
#primena predstavljaju polaznu graÄu za najbitnije algoritme morfoloĆĄke obrade slike
#Otvaranje je operacija koja se sastoji od sukcesivne primene operacije erozije, pa operacije dilatacije. Njena
#namena predstavlja raskidanje uskih prevlaka izmeÄu objekata, glaÄanje nedovoljno glatkih
#ivica objekata, ali i eliminisanje tankih izboÄina.
#Ona predstavlja odliÄan algoritam koji sluĆŸi kako bi se popravili rezultati izdvajanje ivica ili izdvajanja objekata
#koji su potencijalno delom naruĆĄeni ovim obradama
for i in 700:710
sl1[i:i+1,i:i+1] .= 1;
end
sl1[710:900,710:900] .= 1;
imshow(sl1)
sl1_ot = opening(sl1);
imshow(sl1_ot)
imshow(sl1_ot - sl1) #vidimo da se raskinula uska prevlaka izmeÄu ova dva kvadrata
#Zatvaranje predstavlja postupak koji se sastovi od sukcesivne primene operacije dilatacije, pa erozije.
#Ona pre svega za cilj ima popunjavanje spajanje uskih prekida, sitnijih rupa u objektu,
#ali i glaÄanje nedovoljno glatkih ivica
#Ona, kao i otvaranje, predstavlja odliÄan algoritam koji sluĆŸi kako bi se
#popravili rezultati izdvajanje ivica ili izdvajanja objekata
#koji su potencijalno delom naruĆĄeni ovim obradama
sl2 = zeros(Gray{N0f8},200,200);
#sl2 .= 1;
sl2[40:100,40:100] .= 1;
sl2[170:190,170:190] .= 1;
for i in 102:168
sl2[i,i:i+1] .= 1;
end
sl2[45:48, 45:46] .= 0;
sl2[178:182, 178] .= 0;
imshow(sl2)
sl2_zt = closing(sl2);
imshow(sl2_zt)
imshow(sl2_zt - sl2) #Zaista, vidimo da Äe sve manje rupice biti popunjene, ali veza izmeÄu ova dva objekata neÄe
#biti popunjena, jer je razmak izmeÄu njih dosta dugaÄak
#MorfoloĆĄko glaÄanje je operacija koja se sastoji od sukcesivne primene otvaranja slike, a onda potom njenog
#zatvaranja. Ona za cilj ima uklanjanje
sl3 = load("slikaizo.jpg")
sl3_ot = opening(sl3);
sl3_mg = closing(sl3_ot);
mosaicview(sl3, sl3_mg)
#Kao ĆĄto vidimo, glaÄanje je odliÄno uradilo posao, jer je ublaĆŸilo ivice i potisnulo detalje na slici.
#Top Hat transformacija predstavlja transformaciju koja vrĆĄi ekstrakciju sitnih detalja iz slika.
#Ona se veoma efikasno
#izvrĆĄava pomoÄu veÄ ugraÄene funkcije tophat() u programskom jeziku Julia.
#Ona predstavlja linearnu kombinaciju
#naĆĄe slike i neke od operacija otvaranja primenjenoj nad naĆĄom slikom - od originalne
#slike se oduzimanje ona koja je dobijena
#otvaranjem nad njom
sl3_th = tophat(sl3)
mosaicview(sl3, sl3_th)
#Bottom Hat transformacija predstavlja transformaciju koja vrĆĄi ekstrakciju sitnih detalja iz slika.
#Ona se veoma efikasno izvrĆĄava pomoÄu veÄ ugraÄene funkcije bothat() u programskom jeziku Julia.
#Ona predstavlja linearnu kombinaciju naĆĄe slike i neke od operacija
#otvaranja primenjenoj nad naĆĄom slikom - od zatvorenja slike se oduzimanje origalna slika
sl3_bh = bothat(sl3)
mosaicview(sl3, sl3_bh)